/*
 * 巴法科技:2022-11-22
 * 支持巴法app和小程序配网，长按按键可重新配网
 */
#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <EEPROM.h>
#include <Ticker.h>
#include <ArduinoJson.h>
#include <httpUpdate.h>
#include "driver/touch_pad.h"
touch_pad_t touchPin = TOUCH_PAD_NUM0;
uint16_t touchThreshold = 0;
String cqyy = "";
int f5 = 0;
// 白天亮度（0-255）
int brightness = 200;
// 夜间亮度（0-255）
int nightBrightness = 100;

// 模拟电量（0-100）
int batteryLevel = 0;
// 模拟电压（单位：V）
int voltage = 0;
// 模拟电流（单位：A）
int current = 0;
// 模拟最高电压（单位：V）
int maxVoltage = 0;
// 模拟最低电压（单位：V）
int minVoltage = 0;
// 模拟电池压差（单位：mV）
int voltageDiff = 0;
// 模拟电池温度（单位：℃）
int temperature = 0;

int rebootcount = 0;
void loadConfig(bool e);

#include <esp32_tft.h>
#include <esp32_Bfy.h>
#include <esp32_ble.h>

/**
 * 加载存储的信息，并检查是否恢复出厂信息
 */
void loadConfig(bool e)
{
  EEPROM.begin(2);
  if (e)
  {
    rebootcount = EEPROM.read(0);
    if (rebootcount > 0)
    {
      tftPrintf(String(rebootcount));
    }
    Serial.printf("rebootcount...");
    Serial.println(rebootcount);
    if (rebootcount >= 5)
    {
      loadConfig(0);
      update=true;
    }
    rebootcount++;
    EEPROM.write(0, rebootcount);
    EEPROM.commit();
  }
  else
  {
    rebootcount = 0;
    EEPROM.write(0, rebootcount);
    EEPROM.commit();
  }
}
void qidongtouch()
{
  static unsigned long preTouchTick = 0;

  if (millis() - preTouchTick >= 10)
  {
    // 定义白天和夜间模式标识
    static bool lb = false;
    static bool touchState = false;
    static uint32_t touch = touchThreshold;
    static uint32_t touchValu;
    static uint32_t touchRead;

    uint16_t touchReadValue;
    touch_pad_read(touchPin, &touchReadValue);
    if (touchReadValue < touch)
    {
      if (!touchState)
      {
        touchState = true;
        if (!lb)
        {
          lb = true;
          analogWrite(TFT_bl, brightness);
        }
        else
        {
          lb = false;
          analogWrite(TFT_bl, nightBrightness);
        }
      }
    }
    else
    {
      touchState = false;
      touchRead++;
      touchValu += touchReadValue;
      if (touchRead > 300)
      {
        touch = touchValu / 300 * 0.9;
        touchRead = touchValu = 0;
      }
    }
    preTouchTick = millis();
  }
}

const char *getResetReasonText(esp_reset_reason_t reason)
{
  switch (reason)
  {
  case ESP_RST_UNKNOWN:
    return "未知";
  case ESP_RST_POWERON:
    return "上电";
  case ESP_RST_EXT:
    return "外部";
  case ESP_RST_SW:
    return "软件";
  case ESP_RST_PANIC:
    return "异常";
  case ESP_RST_INT_WDT:
    return "中断";
  case ESP_RST_TASK_WDT:
    return "任务";
  case ESP_RST_WDT:
    return "看门";
  case ESP_RST_DEEPSLEEP:
    return "深度";
  case ESP_RST_BROWNOUT:
    return "欠压";
  case ESP_RST_SDIO:
    return "SDIO";
  default:
    return "无效";
  }
}

// 初始化，相当于main 函数
void setup()
{
  Serial.begin(115200);
  Serial.println("Beginning...");
  esp_reset_reason_t reason = esp_reset_reason();
  cqyy = getResetReasonText(reason);
  touch_pad_init();
  touch_pad_config(touchPin, touchThreshold);
  inittft();  // 初始化屏幕
  loadConfig(1);
  delay(1000);
  loadConfig(0);
  startSTA(); // 网络连接
  initble();  // 初始化蓝牙

  // setuptft();
  // qidongtft();
}
// 循环
void loop()
{
  qidongble();
  qidongBFY();
  qidongtouch();
}
